// 树节点数据结构
export interface TreeNode {
  id: string | number
  [key: string]: any
  children?: TreeNode[]
  isLeaf?: boolean
  hasChildren?: boolean
}

// 自定义请求函数类型
export type CustomRequestFn = (params?: any) => Promise<any>

// 自定义搜索函数类型
export type CustomSearchFn = (keyword: string, params?: any) => Promise<any>

// 自定义加载节点函数类型
export type CustomLoadNodeFn = (node: any) => Promise<any[]>

// 数据过滤函数类型
export type DataFilterFn = (data: any) => any[]

// TreeQvil组件属性
export interface TreeQvilProps {
  // v-model绑定值，通常是选中节点的id
  modelValue?: string | number
  // 树形组件标题
  title?: string
  // 是否显示头部
  showHeader?: boolean
  // 是否显示搜索框
  showSearch?: boolean
  // 搜索框占位符
  searchPlaceholder?: string
  // 滚动区域高度
  scrollHeight?: string
  // 滚动条自定义class
  scrollbarClass?: string
  // 请求API地址
  requestApi?: string
  // 搜索API地址
  searchApi?: string
  // 是否使用懒加载
  isLazy?: boolean
  // 在显示复选框的情况下，是否严格的遵循父子不互相关联的做法
  checkStrictly?: boolean
  // 自定义请求函数
  customRequest?: CustomRequestFn
  // 自定义搜索函数
  customSearch?: CustomSearchFn
  // 自定义加载节点函数
  customLoadNode?: CustomLoadNodeFn
  // 节点唯一标识字段名
  nodeKey?: string
  // 节点标签字段名
  labelKey?: string
  // 子节点字段名
  childrenKey?: string
  // 请求参数
  params?: any
  // 数据过滤函数
  dataFilter?: DataFilterFn
}

// TreeQvil组件事件
export interface TreeQvilEvents {
  // 更新选中值
  'update:modelValue': (value: string | number) => void
  // 节点点击事件
  'node-click': (data: TreeNode) => void
  // 刷新事件
  refresh: () => void
}
